package fiuba.algo3.algothief.controlador;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;

import org.xml.sax.SAXException;

import fiuba.algo3.algothief.modelo.*;
import fiuba.algo3.algothief.vista.*;

public class Controlador {

	private Caso modelo;
	private VistaConsola vista;

	public Controlador(Caso modelo) {
		this.modelo = modelo;
	}

	public void lecturaOpcionInicial() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		try
		{
			InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader (isr);
			int opcion = Integer.parseInt(br.readLine());
			switch (opcion) {
			case 1:
				Pais paisDeInicio = this.elegirPaisDeInicio();
				vista.comienzoJuego(paisDeInicio);
				break;
			case 2:
				this.salidaJuego();
				break;
			default:
				break;
			}
		}
		catch(java.io.IOException ioex){}

}

	private void salidaJuego() {
		System.exit(0);
		
	}

	public void setVista(VistaConsola vista) {
		this.vista = vista;
		
	}

	public void lecturaOpcionJuego() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		try
		{
			InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader (isr);
			int opcion = Integer.parseInt(br.readLine());
			switch (opcion) {
			case 1:
				ArrayList<Pais> opcionesAViajar = modelo.elegirOpcionesAViajar();
				vista.mostrarOpcionesAViajar(opcionesAViajar);
				this.volverAlMenu();
				break;
			case 2:
				vista.mostrarTiempo();
				this.volverAlMenu();
				break;
			case 3:
				if (modelo.getLadron().getPosicionSiguientePais() < modelo.getLadron().getCantidadPaisesAEscapar())
				{ArrayList<Lugar> lugares = modelo.getLadron().getSiguientePais().getLugares();
				vista.mostrarLugares(lugares);}
				else {ArrayList<Lugar> lugares = modelo.getLugaresFinales();
				vista.mostrarLugares(lugares);}
				this.volverAlMenu();
				break;
			case 4:
				this.emitirOrdenDeArresto();
				this.volverAlMenu();
				break;
			case 5:
				this.salidaJuego();
				break;
			default:
				break;
			}
		}
		catch(java.io.IOException ioex){}
	}


	private void emitirOrdenDeArresto() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		String sexo = "";
		String hobby = "";
		String cabello = "";
		String senia = "";
		String vehiculo = "";
		
		sexo = this.cargarOpcionesSexo();
		hobby = this.cargarOpcionesHobby();
		cabello = this.cargarOpcionesCabello();
		senia = this.cargarOpcionesSenia();
		vehiculo = this.cargarOpcionesVehiculo();
		this.ingresarDatos(sexo,hobby,cabello,senia,vehiculo);
		
	}

	private void ingresarDatos(String sexo, String hobby, String cabello,
			String senia, String vehiculo) throws ParserConfigurationException, TransformerException, SAXException, IOException {
		String sospechoso = "";
		sospechoso = modelo.getPolicia().ingresaDatos(sexo,hobby,cabello,senia,vehiculo);
		vista.mostrarOrdenDeArresto(sospechoso);
		
	}

	private String cargarOpcionesVehiculo() {
		ArrayList<String> opciones = new ArrayList<String>();
		opciones.add("Descapotable");
		opciones.add("Limusina");
		opciones.add("Deportivo");
		opciones.add("Moto");
		return vista.mostrarDatosPosibles(opciones);
	}

	private String cargarOpcionesSenia() {
		ArrayList<String> opciones = new ArrayList<String>();
		opciones.add("Anillo");
		opciones.add("Tatuaje");
		opciones.add("Cicatriz");
		opciones.add("Joyas");
		return vista.mostrarDatosPosibles(opciones);
	}

	private String cargarOpcionesCabello() {
		ArrayList<String> opciones = new ArrayList<String>();
		opciones.add("Castanio");
		opciones.add("Rubio");
		opciones.add("Rojo");
		opciones.add("Negro");
		return vista.mostrarDatosPosibles(opciones);
	}

	private String cargarOpcionesHobby() {
		ArrayList<String> opciones = new ArrayList<String>();
		opciones.add("Tenis");
		opciones.add("Musica");
		opciones.add("Alpinismo");
		opciones.add("Paracaidismo");
		opciones.add("Natacion");
		opciones.add("Croquet");
		return vista.mostrarDatosPosibles(opciones);
	}

	private String cargarOpcionesSexo() {
		ArrayList<String> opciones = new ArrayList<String>();
		opciones.add("Femenino");
		opciones.add("Masculino");
		return vista.mostrarDatosPosibles(opciones);
	}

	public Pais elegirPaisDeInicio() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		return modelo.elegirPaisDeInicio();
	}

	public void lecturaOpcionLugar(ArrayList<Lugar> lugares)  throws ParserConfigurationException, TransformerException, SAXException, IOException {
		
		try
		{
			InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader (isr);
			int opcion = Integer.parseInt(br.readLine());
			
			if (opcion >=1 && opcion <=3) {
				vista.mostrarFinal(lugares.get(opcion-1).getAcontecimientoFinal());
				if (modelo.getLadron().getPosicionSiguientePais() < modelo.getLadron().getCantidadPaisesAEscapar()) {
						String pistaPedida = modelo.getPolicia().PedirPistaEn(lugares.get(opcion-1)).getContenido();
						vista.mostrarPista(pistaPedida);}
				else if ((lugares.get(opcion-1).getAcontecimientoFinal()).equals("Has recibido una herida por un cuchillo")) {modelo.getPolicia().fueHeridoPorUnCuchillo();}
				else if ((lugares.get(opcion-1).getAcontecimientoFinal()).equals("Has recibido una herida por arma de fuego")) {modelo.getPolicia().fueHeridoPorArmaDeFuego();}
				else if ((lugares.get(opcion-1).getAcontecimientoFinal()).equals("Has arrestado al ladron")) {modelo.getPolicia().agregarArresto();
				this.crearNuevoCaso();
				vista.menuInicial();}
				else {
					this.crearNuevoCaso();
					vista.menuInicial();}
			if (opcion == 4) { this.volverAlMenu();}
				}
		}
		catch(java.io.IOException ioex){}
	}
	
	public void crearNuevoCaso() throws ParserConfigurationException, TransformerException, SAXException, IOException{
		ListaLadrones listaLadrones = new ListaLadrones();
		Ladron unLadron = listaLadrones.ladronAAtrapar(modelo.getPolicia());
		unLadron.setearPistasConAtributos();
		Caso unCaso = new Caso(modelo.getPolicia(),unLadron);
		modelo = unCaso;
	}

	private void volverAlMenu() throws ParserConfigurationException, TransformerException, SAXException, IOException {
		vista.comienzoJuego(modelo.getPolicia().getPaisEnElQueSeEncuentra());	
	}

	public void lecturaOpcionAViajar(ArrayList<Pais> opcionesAViajar) throws ParserConfigurationException, TransformerException, SAXException, IOException {
		try
		{
			InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader (isr);
			int opcion = Integer.parseInt(br.readLine());
			if (opcion >=1 && opcion <=3) {
			modelo.getPolicia().viajarAPais(opcionesAViajar.get(opcion-1));
			modelo.modificarSiguientePais(opcionesAViajar.get(opcion-1));}
			if (opcion == 4) { this.volverAlMenu();}
		}
		catch(java.io.IOException ioex){}
		
	}

	public String lecturaDato(ArrayList<String> opciones) {
		String dato = "";
		try
		{
			InputStreamReader isr = new InputStreamReader(System.in);
	        BufferedReader br = new BufferedReader (isr);
			int opcion = Integer.parseInt(br.readLine());
			if (opcion <= opciones.size()) {dato = opciones.get(opcion-1);}
			if (opcion == opciones.size()+1) { dato = null;}
		}
		catch(java.io.IOException ioex){}
		return dato;
	}
}
